home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / vbcc.lha / vbcc / supp.h < prev    next >
C/C++ Source or Header  |  1997-12-30  |  13KB  |  449 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <limits.h>
  4. #include <string.h>
  5. #include <stddef.h>
  6. #include <stdarg.h>
  7. #include <ctype.h>
  8.  
  9. /* typenames */
  10. #define CHAR 1
  11. #define SHORT 2
  12. #define INT 3
  13. #define LONG 4
  14. #define FLOAT 5
  15. #define DOUBLE 6
  16. #define VOID 7
  17. #define POINTER 8
  18. #define ARRAY 9
  19. #define STRUCT 10
  20. #define UNION 11
  21. #define ENUM 12
  22. #define FUNKT 13
  23.  
  24. #define NQ 15   /* f&NQ gives type without any qualifiers */
  25. #define NU 31   /* f&NU gives type without any qualifiers but UNSIGNED */
  26.  
  27. /* operations on bit-vectors */
  28. #define BSET(array,bit) (array)[(bit)/CHAR_BIT]|=1<<((bit)%CHAR_BIT)
  29. #define BCLR(array,bit) (array)[(bit)/CHAR_BIT]&=~(1<<((bit)%CHAR_BIT))
  30. #define BTST(array,bit) ((array)[(bit)/CHAR_BIT]&(1<<((bit)%CHAR_BIT)))
  31.  
  32. /* type-qualifiers */
  33. #define UNSIGNED 16
  34. #define CONST 64
  35. #define VOLATILE 128
  36. #define UNCOMPLETE 256
  37. #define STRINGCONST 512
  38.  
  39. /*  macro for internal errors */
  40. #define ierror(a) error(-1,(a),__LINE__,FILE_)
  41.  
  42. /* this header is provided by the code generator */
  43. #include "machine.h"
  44.  
  45. struct fi_list {
  46.   char *identifier;
  47.   int class;
  48.   int type;
  49. };
  50.  
  51. /*  additional information for functions; used by the optimizer  */
  52. struct function_info{
  53.   struct IC *first_ic;    /* inline copy of function starts here */
  54.   struct IC *last_ic;     /*  "       "       "      ends here   */
  55.   struct Var *vars;       /* pointer to list of vars of that function */
  56.   char *inline_asm;       /* pointer to code for inline assembler */
  57.   char *translation_unit; /* string as ID for the translation-unit */
  58.   unsigned long flags;    /* misc flags, see above */
  59.   int unresolved_calls;   /* number of function-calls not yet resolved */
  60.   struct fi_list *calls;  /* list of functions called by that function */
  61.   /* registers used and modified by that function */
  62.   unsigned char regs_used[(MAXR+CHAR_BIT)/CHAR_BIT];
  63.   unsigned char regs_modified[(MAXR+CHAR_BIT)/CHAR_BIT];
  64.   /* variables used and modified by this function */
  65.   struct fi_list *used;
  66.   struct fi_list *modified;
  67. };
  68.  
  69. /*  struct for types.    */
  70. struct Typ{
  71.   int flags;  /*  see above   */
  72.   struct Typ *next;
  73.   struct struct_declaration *exact;   /* used for STRUCT/UNION/FUNKT  */
  74.   zlong size;     /*  used for ARRAY  */
  75. };
  76. #define TYPS sizeof(struct Typ)
  77.  
  78. struct Var{
  79.   int storage_class;  /* see below    */
  80.   int reg;            /* Var is assigned to this hard-reg */
  81.   int priority;       /* Priority to be used in simple_regs() */
  82.   int flags;          /* see below */
  83.   char *identifier;   /* name of the variable */
  84.   int nesting;        /* can be freely used by the frontend */
  85.   int index;          /* used by the optimizer */
  86.   zlong offset;       /* offset relative to the stack frame */
  87.   struct Typ *vtyp;   /* type of the variable */
  88.   struct const_list *clist;   /* initialized? */
  89.   struct Var *next;   /* pointer to next variable */
  90.   struct function_info *fi;   /* used by the optimizer */
  91.   struct Var *inline_copy;    /* used for function-inlining */
  92. };
  93.  
  94. /* available storage-classes */
  95. #define AUTO 1          /* var is allocated on the stack */
  96. #define REGISTER 2      /* basically the same as AUTO (C-only) */
  97. #define STATIC 3        /* var is static but has no external linkage */
  98. #define EXTERN  4       /* var is static and has external linkage */
  99. #define TYPEDEF 5       /* C-only */
  100.  
  101. /* available flags in struct Var */
  102. #define USEDASSOURCE 1      /* the var has been read */
  103. #define USEDASDEST 2        /* the var has been written */
  104. #define DEFINED 4           /* the var has been defined (i.e. storage will
  105.                                be allocated in the current file) */
  106. #define USEDASADR 8         /* the address of the var has been taken */
  107. #define GENERATED 16        /* code for static vars has been generated */
  108. #define CONVPARAMETER 32
  109. #define TENTATIVE 64        /* C-only */
  110. #define USEDBEFORE 128      /* used by the optimizer */
  111. #define INLINEV 256         /*  "               "    */
  112. #define PRINTFLIKE 512      /* C-only */
  113. #define SCANFLIKE 1024      /* C-only */
  114. #define NOTTYPESAFE 2048    /* used by the optimizer */
  115. #define DNOTTYPESAFE 4096   /*  "               "    */
  116. #define REGPARM 8192        /* the var is a register parameter */
  117.  
  118. #define SLSIZE 32   /* realloc struct_lists in those steps */
  119.  
  120. /*  These structs are used to describe members of STRUCT/UNION or   */
  121. /*  parameters of FUNKT. Some of the entries in struct_list are not */
  122. /*  relevant for both alternatives.                                 */
  123. struct struct_declaration{
  124.   int count;  /* number of members/parameters */
  125.   struct struct_declaration *next;
  126.   struct struct_list (*sl)[];
  127. };
  128.  
  129. /* C-only */
  130. struct struct_list{
  131.   char *identifier;   /* name of the struct/union-tag */
  132.   struct Typ *styp;   /* type of the member/parameter */
  133.   int storage_class;  /* storage-class of function-parameter */
  134.   int reg;            /* register to pass function-parameter */
  135. };
  136.  
  137. /* This struct represents objects in the intermediate code. */
  138. struct obj{
  139.   int flags;      /* see below */
  140.   int reg;        /* number of reg if flags® */
  141.   struct Var *v;
  142.   struct AddressingMode *am;
  143.   union atyps{
  144.     zchar vchar;
  145.     zuchar vuchar;
  146.     zshort vshort;
  147.     zushort vushort;
  148.     zint vint;
  149.     zuint vuint;
  150.     zlong vlong;
  151.     zulong vulong;
  152.     zfloat vfloat;
  153.     zdouble vdouble;
  154.     zpointer vpointer;
  155.   }val;
  156. };
  157.  
  158.  
  159. /*  Available flags in struct obj.  */
  160.                     /*  KONST muss immer am kleinsten sein, um beim Swappen */
  161.                     /*  fuer available_expressions und Konstanten nach      */
  162.                     /*  rechts nicht in eine Endlosschleife zu kommen.      */
  163.  
  164. #define KONST 1     /*  The object is a constant. Its value is stored in    */
  165.                     /*  val.                                                */
  166. #define VAR 2       /*  The object is a variable (stored in v).             */
  167. #define SCRATCH 8   /*  The object is a temporary.                          */
  168. #define STACK 16    /*  obsolete                                            */
  169. #define DREFOBJ 32  /*  The object must be dereferenced.                    */
  170. #define REG 64      /*  The object is contained in a hardware register.     */
  171. #define VARADR 128  /*  The object is the address of a static variable.     */
  172. #define DONTREGISTERIZE 256 /*  Do not put this object into a register.     */
  173.  
  174.  
  175. /*  The quads in the intermediate code. */
  176. struct IC{
  177.   struct IC *prev;    /* pointer to the next IC */
  178.   struct IC *next;    /* pointer to the previous IC */
  179.   int code;           /* see below */
  180.   int typf;           /* usually type of the operands, see interface.doc */
  181.   int defindex;       /* used by optimizer */
  182.   int expindex;
  183.   int copyindex;
  184.   int change_cnt;
  185.   int use_cnt;
  186.   int line;           /* corresponding line in source file (or 0) */
  187.   struct varlist *change_list;    /* used by optimizer */
  188.   struct varlist *use_list;
  189.   struct obj q1;      /* source 1 */
  190.   struct obj q2;      /* source 2 */
  191.   struct obj z;       /* target */
  192.   char *file;         /* filename of the source file */
  193. };
  194. #define ICS sizeof(struct IC)
  195.  
  196.  
  197. /*  Available codes for struct IC. See interface.doc. */
  198. #define KOMMA 1
  199. #define ASSIGN 2
  200. #define ASSIGNADD 3
  201. #define ASSIGNSUB 4
  202. #define ASSIGNMULT 5
  203. #define ASSIGNDIV 6
  204. #define ASSIGNMOD 7
  205. #define ASSIGNAND 8
  206. #define ASSIGNXOR 9
  207. #define ASSIGNOR 10
  208. #define ASSIGNLSHIFT 11
  209. #define ASSIGNRSHIFT 12
  210. #define COND 13
  211. #define LOR 14
  212. #define LAND 15
  213. #define OR 16
  214. #define XOR 17
  215. #define AND 18
  216. #define EQUAL 19
  217. #define INEQUAL 20
  218. #define LESS 21
  219. #define LESSEQ 22
  220. #define GREATER 23
  221. #define GREATEREQ 24
  222. #define LSHIFT 25
  223. #define RSHIFT 26
  224. #define ADD 27
  225. #define SUB 28
  226. #define MULT 29
  227. #define DIV 30
  228. #define MOD 31
  229. #define NEGATION 32
  230. #define KOMPLEMENT 33
  231. #define PREINC 34
  232. #define POSTINC 35
  233. #define PREDEC 36
  234. #define POSTDEC 37
  235. #define MINUS 38
  236. #define CONTENT 39
  237. #define ADDRESS 40
  238. #define CAST 41
  239. #define CALL 42
  240. #define INDEX 43
  241. #define DPSTRUCT 44
  242. #define DSTRUCT 45
  243. #define IDENTIFIER 46
  244. #define CEXPR 47
  245. #define STRING 48
  246. #define MEMBER 49
  247. #define CONVCHAR 50
  248. #define CONVSHORT 51
  249. #define CONVINT 52
  250. #define CONVLONG 53
  251. #define CONVFLOAT 54
  252. #define CONVDOUBLE 55
  253. #define CONVVOID 56
  254. #define CONVPOINTER 57
  255. #define CONVUCHAR 58
  256. #